今天就是Reverse最後一天,會把兩顆星的題目做完,至於三顆星的題目大家可以自己去嘗試看看,若是之後有做出來會再補上
$ ./radix 100
Incorrect Password!
直接丟ghidra看看吧,題目的提示有說這跟Base64有關係,這是一種編碼方式,有興趣的可以自行google這裡不多做介紹
這邊只呼叫一個 check_password
的函式,進去後會看到很長一段程式碼,不過在組合語言碼的後面看到了一段很可疑的字串
這邊跟這段奇怪的字串做比較,再加上題目有提到Base64,把這段複製下來丟去解碼看看
果然,這段就是Flag,解CTF的時候其實也要仔細看看有沒有很明顯的線索,像這題就可以很快的找到Flag
$ ./activate 123
Please Provide a VALID 16 byte Product Key.
直接丟ghidra看看
這邊呼叫兩個函式 check_valid_key
和 validate_key
,看起來目標應該是validate_key
這邊又呼叫了一個 ord
的函式
綜合以上,可以看出來我們所輸入的字串只會有 0~9, A~Z 且長度為16
所以回到validate_key
上,將輸入的字串經過一番運算(validate_key)之後算出來的值%36再與這個字串中的最後一個字元做比較,若相同就可以得到Flag
程式碼如下
int ord(char c){
if(c<'0'||c>'9')
if(c=>'A'&& c<='Z')
return c-=55;
else
return c-=48;
}
int validate_key(char *key){
int x,sum=0;
for(int i=0;i<15;i++){
x=ord(key[i]);
sum=sum+i*(x+1);
}
x=ord(key[15]);
return x==(sum%36);
}
前面15個字可以隨便舉都沒關係,那在這邊為了方便就全部都舉A,以下是程式碼
#include <stdio.h>
int ord(char c){
if(c<'0'||c>'9')
if(c>='A'&& c<='Z')
return c-=55;
else
return c-=48;
}
int validate_key(){
char key='A';
int x,sum=0;
for(int i=0;i<15;i++){
sum=sum+(i+1)*(ord(key)+1);
}
return sum%36+55;
}
int main(){
printf("%c\n",validate_key()); #O
}
所以只要在15個A後面加一個O就可以成功拿到Flag了
$ ./activate AAAAAAAAAAAAAAAO
Product Activated Successfully: picoCTF{k3yg3n5_4r3_s0_s1mp13_1295245566}
今天就是reverse的最後一篇了,接下來講的內容是Forensics的部份,因為reverse的題目大都比較長所以花比較多天在講reverse的部份,不過reverse的題目蠻有趣的,雖然充滿組合語言XD,不過也運用到很多實用的技巧以及程式撰寫的能力,接下來也請期待Forensics吧~